package com.outbrain.gruffalo.netty; import com.google.common.base.Preconditions; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.UnpooledByteBufAllocator; import io.netty.channel.Channel; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.ChannelPipeline; import io.netty.channel.EventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.handler.codec.string.StringDecoder; import io.netty.handler.codec.string.StringEncoder; import io.netty.handler.timeout.IdleStateHandler; /** * Time: 8/4/13 10:06 AM * * @author Eran Harel */ public class GraphiteClientChannelInitializer extends ChannelInitializer<Channel> { private final String graphiteHost; private final int graphitePort; private final EventLoopGroup eventLoopGroup; private final StringDecoder decoder; private final StringEncoder encoder; private ChannelHandler graphiteHandler; public GraphiteClientChannelInitializer(final String graphiteHost, final int graphitePort, final EventLoopGroup eventLoopGroup, final StringDecoder decoder, final StringEncoder encoder, final ChannelHandler graphiteHandler) { this.graphiteHost = graphiteHost; this.graphitePort = graphitePort; this.decoder = Preconditions.checkNotNull(decoder, "decoder must not be null"); this.encoder = Preconditions.checkNotNull(encoder, "encoder must not be null"); this.graphiteHandler = Preconditions.checkNotNull(graphiteHandler, "graphiteHandler must not be null"); this.eventLoopGroup = Preconditions.checkNotNull(eventLoopGroup, "eventLoopGroup must not be null"); } public ChannelFuture connect() { return configureBootstrap().connect(); } private Bootstrap configureBootstrap() { Bootstrap bootstrap = new Bootstrap(); bootstrap.remoteAddress(graphiteHost, graphitePort); bootstrap.group(eventLoopGroup); bootstrap.channel(NioSocketChannel.class); bootstrap.handler(this); bootstrap.option(ChannelOption.SO_LINGER, 0); bootstrap.option(ChannelOption.ALLOCATOR, UnpooledByteBufAllocator.DEFAULT); return bootstrap; } @Override protected void initChannel(Channel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new IdleStateHandler(0, 10, 0)); pipeline.addLast("decoder", decoder); pipeline.addLast("encoder", encoder); // we don't really read responses... pipeline.addLast("handler", graphiteHandler); } }